<?php
/**
 * Nweb Framework
 *
 * This script is protected by copyright. It's use, copying, modification
 * and distribution without written consent of the author is prohibited.
 *
 * @category    source
 * @package     pl.nweb.framework.autoloader
 * @author      Krzysztof Kardasz <krzysztof.kardasz@gmail.com>
 * @copyright   Copyright (c) 2011 Krzysztof Kardasz
 * @license     http://www.gnu.org/licenses/lgpl-3.0.txt  GNU Lesser General Public
 * @version     3.0 $Id: exception.php 435 2011-09-23 13:24:30Z krzysztof.kardasz $
 * @link        http://code.google.com/p/nweb-framework/
 * @link        http://framework.nweb.pl
 */

namespace pl\nweb\framework\autoloader;

/**
 * Autoloadera aplikacji
 *
 * @category    source
 * @package     pl.nweb.framework.autoloader
 * @author      Krzysztof Kardasz <krzysztof.kardasz@gmail.com>
 * @copyright   Copyright (c) 2011 Krzysztof Kardasz
 * @version     3.0 $Id: exception.php 435 2011-09-23 13:24:30Z krzysztof.kardasz $
 */
class Application implements iAutoloader
{
    /**
     * Źródła
     *
     * @var string
     */
    private static $_src = null;

    /**
     * Przestrzeń nazw aplikacji
     *
     * @var string
     */
    private $_namespaces = array();

    /**
     * Zwraca ścieżkę aplikacji
     *
     * @return string
     */
    public function getSrc ()
    {
        if(null === self::$_src) {
            self::$_src = substr(__DIR__, 0, -29);
        }
        return self::$_src;
    }

    /**
     * Definiowanie przestrzeni nazw
     *
     * @return string
     */
    public function addNamespace ($namespace, $dir)
    {
        $this->_namespaces[] = array($namespace, $dir, strlen($namespace));
    }

    /**
     * Autoładowanie klasy
     *
     * @param  string $class nazwa klasy
     * @return boolean
     */
    public function load ($class)
    {
        if(class_exists($class, false) || interface_exists($class, false)) {
            return true;
        }

        $file = str_replace('\\', DIRECTORY_SEPARATOR, strtolower($class)) . '.php';
        if($this->_find($this->getSrc() . DIRECTORY_SEPARATOR . $file)) {
            return true;
        }

        foreach ($this->_namespaces as $namespace) {
            if(substr($class, 0, $namespace[2]) == $namespace[0]) {
                if($this->_find($namespace[1] . DIRECTORY_SEPARATOR  . $file)) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * Próba znalezienia pliku
     *
     * @param string $class
     * @param string $path
     * @throws Exception
     */
    private function _find ($path)
    {
        if(is_file($path)) {
            include_once $path;
            return true;
        }
        return false;
    }
}